package org.dromara.common.sensitive.annotation;

import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import org.dromara.common.sensitive.core.SensitiveStrategy;
import org.dromara.common.sensitive.handler.SensitiveHandler;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：数据脱敏注解
 */
// 定义注解的保留策略为运行时，确保在运行时可以读取到注解信息
@Retention(RetentionPolicy.RUNTIME)
// 定义注解的目标为字段，用于标记字段
@Target(ElementType.FIELD)
// 标记该注解属于 Jackson 内置注解的一部分，用于序列化和反序列化时的特殊处理
@JacksonAnnotationsInside
// 指定使用 SensitiveHandler 类作为序列化处理器，用于自定义字段的序列化方式
@JsonSerialize(using = SensitiveHandler.class)
/**
 * 敏感信息注解，用于标记和管理敏感信息的访问策略
 * 通过本注解，可以指定敏感信息的处理策略、角色权限和具体权限，以实现对敏感数据的细粒度访问控制
 */
public @interface Sensitive {
    /**
     * 返回敏感信息的处理策略
     *
     * @return 敏感信息处理策略的枚举值
     */
    SensitiveStrategy strategy();

    /**
     * 返回角色权限的键值
     * 用于指定访问本注解标记的敏感信息所需的角色权限键，通过该键可以进一步校验用户角色
     *
     * @return 角色权限的键值
     */
    String roleKey() default "";

    /**
     * 返回具体的权限字符串
     * 用于指定访问本注解标记的敏感信息所需的特定权限，可以用于进一步的权限校验
     *
     * @return 具体的权限字符串
     */
    String perms() default "";
}
